const { readFileSync } = require('fs');
const { resolve } = require('path');
const { compileHTML } = require('./compiler');

const INNER_MARK = '<!-- inner -->';

class MdToHtmlPlugin {
  constructor ({ template, filename }) {

    if (!template) {
      throw new Error('The config of "template" must be configured')
    }

    this.template = template;
    this.filename = filename ? filename : 'md.html';
  }
  
  // webpack 为每个plugin 提供一个 apply方法 
  // 编译过程中都是在这个apply() 里做的 接收一个编译器 里面有hooks 钩子集合,  
  apply(compiler) {
    // 使用emit的tap方法获取assets(资源)
    compiler.hooks.emit.tap('md-to-html-plugin', (compilation) => {
      const _assets = compilation.assets;
      // console.log(_assets);
      // 获取md 文件资源 与 模板html内容
      const _mdContent = readFileSync(this.template, 'utf8');
      // console.log(_mdContent);
      const _templateHTML = readFileSync(resolve(__dirname, 'template.html'), 'utf8');
      const _mdContentArr = _mdContent.split('\n');
      // console.log(_mdContentArr);
      // 转html 字符串
      const _htmlStr = compileHTML(_mdContentArr);
      // console.log(_htmlStr);
      // 替换模板html里的标记
      const _finalHTML = _templateHTML.replace(INNER_MARK, _htmlStr);

      _assets[this.filename] = { // 给编译时添加资源
        source() {
          return _finalHTML;
        },
        size() {
          return _finalHTML.length;
        }
      }
    })
  }

}

module.exports = MdToHtmlPlugin;